AWS Elemental MediaPackageのVODパッケージングでアクセスログを設定してみた
はじめに
清水です。AWS Elemental MediaPackageでは2020年10月のアップデートでライブパッケージング機能に対してのアクセスログをサポートしました。
そこから数ヶ月、MediaPackageのユーザガイドのドキュメント履歴を確認してみたところVODパッケージング機能に対してもアクセスログがサポートされるようになっていました、2021年2月24日付のドキュメントアップデートです。本エントリではこのMediaPakcageのVODパッケージングでアクセスログを設定、確認してみたのでまとめてみます。
MediaPackageのVODパッケージングでアクセスログを設定してみた
それでは実際にMediaPackageのVODパッケージング機能でアクセスログを有効化し、その内容を確認していきます。
VODパッケージングを行う上での準備
MediaPackageでVODパッケージングを行うにあたり、MediaPackageからS3へのアクセス権を設定したIAMロールが必要となります。ユーザガイドのAmazon S3 access for VOD workflowsを参考にIAMポリシーを作成しIAMロールに紐付けます。このIAMロールは信頼ポリシー(信頼関係)で"Service": "mediapackage.amazonaws.com"
をPrincipalに持つように設定します。詳細はユーザガイドのAllowing AWS Elemental MediaPackage to access other AWS servicesを参照ください。また実際に設定した例をMediaPackageのVODパッケージング機能をまとめたエントリに記載しています。本エントリではこの際に作成したIAMロールMediaPackageVoD-Role
を使用します。
またVODパッケージングの入力はS3上にあるHLSまたはSMIL形式のコンテンツとなります。(VOD supported codecs and input types)今回はIAMロールと同様、MediaPackageのVODパッケージング機能をまとめたエントリ記載の際のHLS形式のコンテンツをそのまま使用します。iPhoneで撮影した動画(拡張子mov、QuickTime形式)をAWS Elemental MediaConvertのJob templates、System templates/System-Ott_Hls_Ts_Avc_Aacを使って変換したものになります。
Packaging groupの作成とアクセスログ有効化
MediaPackageのVODパッケージングにおけるリソース単位となるPackaging groupsをAWSマネジメントコンソールから作成します。この作成の際に、アクセスログ設定箇所があるので、こちらを有効にします。アクセスログの出力先はCloudWatch Logsです。Log group nameを指定可能ですが、デフォルトのVodEgressAccessLogs
のまま進めます。
[Create]を押下してpackaging groupを作成すると、AWSServiceRoleForMediaPackage
というIAMロールが作成されます。こちらはMediaPackageがCloudWatch Logsにアクセスログを書き込むために使用するもので、このIAMロールが存在していなければアクセスログ設定時に作成される、という挙動かと思います。
権限としてはAWS managed policy「MediaPackageServiceRolePolicy」がアタッチされ、信頼ポリシーで"Service": "mediapackage.amazonaws.com"をPrincipalに持つよう設定されていました。
AWS managed policyのMediaPackageServiceRolePolicyは現時点(2021/06/30)で以下の内容が設定されていました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:PutLogEvents", "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*:log-stream:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/MediaPackage/*" } ] }
Packaging groupの設定とAssetsの作成
作成されたPackaging groupについて、Packaging configurationを作成します。実際にどんなパッケージングを行うかの設定ですね。[Manage configurations]ボタンから進みます。
Idを「mediapackage-vod-packaging-access-logging-hls-config」と設定、Package typeはデフォルトのApple HLS
のままとします。(ほか項目もデフォルトのまま進めます。)
もう一つ、Package typeをDASH-ISO
としたPackaging configurationも作成しておきます。Idを「mediapackage-vod-packaging-access-logging-dash-config」としました。Package type以外の項目はデフォルトとします。
続いてAssetsを作成します。先述の通り別エントリで準備していたVODコンテンツを使用します。格納されているS3バケットを選択、IAMロールはMediaPackageVoD-Role
を選択します。Asset detailsにて、S3バケット内のm3u8ファイルへのパスを入力します。
Packaging settingsでは、先ほど作成したPackaging group「mediapackage-vod-packaging-access-logging」を選択します。最後に[Ingest assets]ボタンでAssetsが作成されます。
VODの再生とアクセスログの確認
Assetの準備ができたら(CloudWatch Eventsで確認ができます)、Playback detailsの各configurationのURLを確認して、パッケージングされたVODを再生してみます。VideoJS HTTP Streaming (VHS)を使ってHLS、DASHとも数回再生をしてみました。
VODの再生後、AWSマネジメントコンソールのCloudWatchページ、Log groupsを確認してみます、以下のようにロググループ「/aws/MediaPackage/VodEgressAccessLogs」といくつかのログストリームができていますね。
実際のログエントリを2つほどひろってみました。(うまくマニフェストファイルへのアクセスがひろえました。)
{ "timestamp": "2021-06-30T07:11:01.645302Z", "clientIp": "XXX.XXX.XXX.XXX", "processingTime": 0.09000000000000001, "statusCode": "200", "receivedBytes": 466, "sentBytes": 623, "method": "GET", "request": "https://b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com:443/out/v1/ea69xxxxxxxxxxxxxxxxxxxxxxxxxxxx/1487xxxxxxxxxxxxxxxxxxxxxxxxxxxx/6648xxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.m3u8", "protocol": "HTTP/2.0", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "account": "123456789012", "domainName": "b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com", "requestId": "Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxx536ac", "packagingConfigArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-configurations/mediapackage-vod-packaging-access-logging-hls-config", "packagingGroupArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-groups/mediapackage-vod-packaging-access-logging", "assetArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2" }
{ "timestamp": "2021-06-30T07:14:04.555375Z", "clientIp": "XXX.XXX.XXX.XXX", "processingTime": 0.149, "statusCode": "200", "receivedBytes": 447, "sentBytes": 2112, "method": "GET", "request": "https://b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com:443/out/v1/ea69xxxxxxxxxxxxxxxxxxxxxxxxxxxx/c7b6xxxxxxxxxxxxxxxxxxxxxxxxxxxx/13ccxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.mpd", "protocol": "HTTP/2.0", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "account": "123456789012", "domainName": "b56axxxxxxxxxxxxxxxxxxxxxxxxxxxx.egress.mediapackage-vod.ap-northeast-1.amazonaws.com", "requestId": "Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxec020", "packagingConfigArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-configurations/mediapackage-vod-packaging-access-logging-dash-config", "packagingGroupArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:packaging-groups/mediapackage-vod-packaging-access-logging", "assetArn": "arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2" }
MediaPackageユーザガイドのAccess logging - Read the access logs に例示されているサンプルをもとに、CloudWatch Logs Insightsでの確認もしてみましょう。Assetごと(といっても1つだけですが)、statusCodeでカウントしてみました。
fields @timestamp, @message | filter assetArn like 'arn:aws:mediapackage-vod:ap-northeast-1:123456789012:assets/Sample-20190113-1-2' | stats count() by statusCode
まとめ
AWS Elemental MediaPackageのVODパッケージングでアクセスログを設定してみました。ライブパッケージングでのアクセスログサポートのアップデートから、わずか約4ヶ月でのVODパッケージングでのサポートです、大変嬉しいですね。VODパッケージングではライブパッケージングとリソース構成などが異なることから(そもそもAPIなども異なりますね)、ログフィールドの中身もライブパッケージングと異なる項目があります。内容を確認する際には注意しましょう。